package com.linkgie.galaxyframework.metadata;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 字段的状态绑定标注
 * <p>
 * 
 * 用于将字段绑定到由 {@link StateKey} 和 {@link StatePredicate} 相关标注声明的状态标识；
 * <p>
 * 当实体实例根据 {@link StateKey} 判定处于某种状态时，绑定到该状态的字段的相关属性(例如 {@link #visible()} 和
 * {@link #readonly()} )会更新为绑定的值；
 * 
 * @author huanghaiquan
 *
 */
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface StateBinding {

	/**
	 * 字段绑定的状态名称；
	 * 
	 * @return
	 */
	String state();

	/**
	 * 处于绑定状态下时，字段是否可见；
	 * <p>
	 * 默认为 true ；
	 * <p>
	 * 
	 * 当 {@link #enableVisible()} 设置为 true 时， {@link #visible()} 才生效；
	 * <p>
	 * 此时，设置为 true 时，处于绑定状态下字段可见，处于非绑定状态下不可见；<br>
	 * 此时，设置为 false 时，处于绑定状态下字段不可见，处于非绑定状态下可见；<br>
	 * 
	 * <p>
	 * 
	 * @return
	 */
	boolean visible() default true;

	/**
	 * 是否绑定字段的可见性；
	 * <p>
	 * 默认为 true ；
	 * <p>
	 * 
	 * 当设置为 true 时， {@link #visible()} 才生效；
	 * 
	 * @return
	 */
	boolean enableVisible() default true;

	/**
	 * 处于绑定状态下时，字段是否只读；
	 * <p>
	 * 默认为 false ；
	 * <p>
	 * 当 {@link #enableReadonly()} 设置为 true 时， {@link #readonly()} 才生效；
	 * 
	 * @return
	 */
	boolean readonly() default false;

	/**
	 * 是否绑定字段的可见性；
	 * <p>
	 * 默认为 false ；
	 * <p>
	 * 当设置为 true 时， {@link #readonly()} 才生效；
	 * 
	 * @return
	 */
	boolean enableReadonly() default false;
	

	/**
	 * 当字段为可迭代类型时，支持的对字段的数据列表的操作；
	 * 
	 * <p>
	 * 默认支持增加(Add)、修改(Update)、删除(Delete)操作；
	 * 
	 * @return
	 */
	@DataField(name = "可修改", order = 23)
	IteratorOperation[] iterates() default { IteratorOperation.ADD, IteratorOperation.UPDATE,
			IteratorOperation.DELETE };
			

			/**
			 * 是否绑定字段的可见性；
			 * <p>
			 * 默认为 false ；
			 * <p>
			 * 当设置为 true 时， {@link #iterates()} 才生效；
			 * 
			 * @return
			 */
			boolean enableIterates() default false;
}
